package br.com.virtual.base.controller.cadastro;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;

import org.primefaces.event.FileUploadEvent;

import br.com.virtual.base.controller.carrinho.CarrinhoMB;
import br.com.virtual.base.controller.util.VirtualMB;
import br.com.virtual.base.enums.ActionFormEnum;
import br.com.virtual.base.exceptions.VirtualValidationException;
import br.com.virtual.cadastrar.model.Categoria;
import br.com.virtual.cadastrar.model.Foto;
import br.com.virtual.cadastrar.model.Grupo;
import br.com.virtual.cadastrar.model.Produto;
import br.com.virtual.cadastrar.service.CategoriaService;
import br.com.virtual.cadastrar.service.FotoService;
import br.com.virtual.cadastrar.service.GrupoService;
import br.com.virtual.cadastrar.service.PhotoManagerService;
import br.com.virtual.cadastrar.service.ProdutoService;

@ManagedBean
@ViewScoped
public class ProdutoMB extends VirtualMB {


	private static final long serialVersionUID = 1L;
	private Produto produto;
	private List<Produto> produtos;
	private List<Produto> produtosAtivos;
	private List<Produto> produtosDestaque;
	private List<Produto> produtosBanner;

	private List<Foto> fotos;
	private List<Foto> fotosNovas;
	private Foto foto;
	private Foto fotoExibir;
	private ActionFormEnum stateForm = ActionFormEnum.CREATE;
	private String nomeBuscar;

	private Long catId;
	private Long gruId;

	/* AUX */

	// private String temp;
	private Integer idFicticioImagem = 1;
	private int exibirDivLinha = -1;
	private int numColunas = 3;

	@EJB
	private ProdutoService produtoService;
	@EJB
	private FotoService fotoService;
	@EJB
	private PhotoManagerService fotoManagerService;
	@EJB
	private GrupoService grupoService;
	@EJB
	private CategoriaService categoriaService;

	@PostConstruct
	private void init() {

		// TesteWS.httpClientPost();

		foto = new Foto();
		produto = (Produto) FacesContext.getCurrentInstance()
				.getExternalContext().getFlash().get("produto");

		try {
			Long idProduto = Long.valueOf(this.getRequestValue("p"));
			if (idProduto != null) {
				setProduto(this.produtoService.read(idProduto));
				
				if(produto == null)
					this.redirectToIndex();
				
				CarrinhoMB carrinhoMB = (CarrinhoMB) getManagedBean("carrinhoMB");
				if (carrinhoMB != null)
					carrinhoMB.calculaFrete(getProduto());
			}

		} catch (NumberFormatException e) {
		}

		// produto = produtoService.read(151L);

		if (produto == null) {
			novo();

		} else {
			stateForm = ActionFormEnum.UPDATE;
			this.listarTodasFotos();
		}
		produtos = null;
		// temp = null;

		this.setSession("produtoAvaliacao", produto);
	}

	private void valoresRequestGet() {

		try {
			this.nomeBuscar = (String) this.getRequestValue("b");
		} catch (Exception e) {
			this.nomeBuscar = null;
		}

		try {
			this.gruId = Long.valueOf(this.getRequestValue("g"));
		} catch (NumberFormatException e) {
			this.gruId = null;
		}

		try {
			this.catId = Long.valueOf(this.getRequestValue("c"));
		} catch (NumberFormatException e) {
			this.catId = null;
		}
	}

	public void novo() {

		stateForm = ActionFormEnum.CREATE;
		produto = new Produto();
		foto = new Foto();
		fotosNovas = new ArrayList<Foto>();
		fotoExibir = null;
		fotos = null;
		produtos = null;
	}

	public void save() {

		try {

			produto.setPreco_venda_desconto(produto.getPreco_venda()
					* (1 - produto.getPercentual_desconto() / 100));

			if (stateForm.equals(ActionFormEnum.CREATE)) {
				produtoService.create(produto);
			} else if (stateForm.equals(ActionFormEnum.UPDATE)) {
				produtoService.update(produto);
			}

			if (fotosNovas != null)
				salvarFotos();
			addFacesMessage("Operação realizada com sucesso.",
					FacesMessage.SEVERITY_INFO, "msgCadastro");
//NEWSLETTER			this.resetSessionNews();
		} catch (VirtualValidationException e) {
			for (String s : e.getErros()) {
				addFacesMessage(s, FacesMessage.SEVERITY_ERROR, "msgCadastro");
			}
		}
		novo();
	}

	public void edit() {

		// produto = produtoService.read(42L);

		stateForm = ActionFormEnum.UPDATE;
		fotosNovas = new ArrayList<Foto>();
		listarTodasFotos();
		if (!fotos.isEmpty())
			fotoExibir = fotos.get(0);
	}

//NEWSLETTER	private void resetSessionNews() {
//
//		NewsletterMB nl = (NewsletterMB) this.getManagedBean("newsletterMB");
//		if (nl != null) {
//			nl.setProdutoNews(null);
//			nl.setProdutoDM(null);
//		}
//	}

	public String delete(ActionEvent evento) {

		try {
			produtoService.delete(produto);
			addFacesMessage("Item excluido com sucesso.",
					FacesMessage.SEVERITY_INFO, "msgListagem");
//NEWSLETTER			this.resetSessionNews();
		} catch (VirtualValidationException e) {
			for (String s : e.getErros()) {
				addFacesMessage(s, FacesMessage.SEVERITY_ERROR, "msgListagem");
			}
		}
		novo();
		return "";
	}

	public String buscar() {

		return "/busca.jsf?faces-redirect=true&b=" + this.nomeBuscar;
	}

	public boolean renderImagens() {

		if (fotos != null && fotos.size() > 0)
			return true;

		return false;
	}

	public void exibir() {
	}

	public String visualizarDetalhes(Long id) {
		return "/exibir/produtodetalhes.jsf?faces-redirect=true&p=" + id;
	}

	// public void handleFileUpload(FileUploadEvent event) {
	//
	// FacesMessage msg = new FacesMessage("Succesful", event.getFile()
	// .getFileName() + " is uploaded.");
	// FacesContext.getCurrentInstance().addMessage(null, msg);
	// }

	public void enviarFoto(FileUploadEvent event) {

		foto.setImagem(event.getFile().getContents());
		foto.setProduto(produto);
		foto.setDescricao("fic_" + idFicticioImagem++);
		fotoExibir = foto;
		if (fotosNovas == null)
			fotosNovas = new ArrayList<Foto>();
		fotosNovas.add(foto);
		
//		produto.getFotos().add(foto);
//		setSession(SessionNameEnum.PRODUTO_EXIBIR_FOTO.toString(), produto);
		
		this.fotoManagerService.addPhotosToTemporaryDirectory(fotosNovas);
		
		
		foto = new Foto();
		listarTodasFotos();
	}

	private void salvarFotos() {

		try {
			fotoService.create(fotosNovas);
		} catch (VirtualValidationException e) {
			// for (String ex : e.getErros()) {}
			// addFacesMessage(ex, FacesMessage.SEVERITY_ERROR);
		}
		fotos = null;
		fotosNovas = new ArrayList<Foto>();
	}

	public void listarTodasFotos() {

		if (produto.getId() != null) {
			fotos = fotoService.getList(produto);
		}

		if (fotosNovas != null && fotosNovas.size() > 0) {

			if (fotos != null) {

				for (Foto fotoNova : fotosNovas) {
					if (!fotos.contains(fotoNova))
						fotos.add(fotoNova);
				}

			} else
				fotos = new ArrayList<Foto>(fotosNovas);
		}
		
//		fotoExibir = fotos.get(0);

		// if (fotos != null && fotos.size() > 0)
		// listarFotosProduto(fotos);
	}

	public void listarNovasFotos() {

		fotos = new ArrayList<Foto>();

		if (fotosNovas != null && fotosNovas.size() > 0)
			fotos.addAll(fotosNovas);

	}

	public Foto fotoProduto(Produto produto) {

		Foto foto = fotoService.getFirstByProduto(produto);

		if (foto != null) {
			foto.setDescricao(foto.getId().toString());
		} else {
			foto = new Foto();
		}

		return foto;
	}

	public String divAbreLinha() {

		exibirDivLinha += 1;
		if ((exibirDivLinha % numColunas) == 0)
			return "<div class=\"row-fluid\">";
		else
			return "";
	}

	public String divFechaLinha() {

		if ((exibirDivLinha % numColunas) == (numColunas - 1))
			return "</div>";
		else
			return "";
	}

	public String divFechaLinhaNaoCompleta() {

		if ((exibirDivLinha % numColunas) != (numColunas - 1))
			return "</div>";
		else
			return "";
	}

	private List<Produto> getProdutosByCategoria(Categoria categoria) {

		return categoria != null ? this.produtoService
				.getProdutosByCategoria(categoria) : null;
	}

	private List<Produto> getProdutosByGrupo(Grupo grupo) {

		return grupo != null ? this.produtoService.getProdutosByGrupo(grupo)
				: null;
	}

	
	public boolean hasProdutoEmEstoque(Produto produto){
		
		return produto.getQuantidade() > 0;
		
	}
	
	
	public boolean isNotEmpty(String string) {

		return !(string == null || string.isEmpty());
	}

	/*
	 * GETTERS AND SETTERS
	 */
	public Produto getProduto() {

		return produto;
	}

	public void setProduto(Produto produto) {

		this.produto = produto;
	}

	public List<Produto> getProdutos() {

		if (produtos == null) {
			produtos = produtoService.getList();
			// Collections.sort(produtos);
		}
		return produtos;
	}

	public void setProdutos(List<Produto> produtos) {

		this.produtos = produtos;
	}

	public List<Produto> getProdutosAtivos() {

		if (produtosAtivos == null) {
			produtosAtivos = produtoService.getListAtivo();
			Collections.sort(produtosAtivos);
		}
		return produtosAtivos;
	}

	public void setProdutosAtivos(List<Produto> produtosAtivos) {

		this.produtosAtivos = produtosAtivos;
	}

	public ActionFormEnum getStateForm() {

		return stateForm;
	}

	public void setStateForm(ActionFormEnum stateForm) {

		this.stateForm = stateForm;
	}

	public List<Foto> getFotos() {

		if (fotos == null)
			listarTodasFotos();

		return fotos;
	}

	public void setFotos(List<Foto> fotos) {

		this.fotos = fotos;
	}

	public Foto getFoto() {

		return foto;
	}

	public void setFoto(Foto foto) {

		this.foto = foto;
	}

	public List<Foto> getFotosNovas() {

		if (fotosNovas == null)
			fotosNovas = new ArrayList<Foto>();
		return fotosNovas;
	}

	public void setFotosNovas(List<Foto> fotosNovas) {

		this.fotosNovas = fotosNovas;
	}

	public Foto getFotoExibir() {

		if (fotoExibir == null && fotos != null && fotos.size() > 0)
			fotoExibir = fotos.get(0);

		return fotoExibir;
	}

	public void setFotoExibir(Foto fotoExibir) {
		this.fotoExibir = fotoExibir;
	}

	public List<Produto> getProdutosDestaque() {

		this.valoresRequestGet();

		if (this.nomeBuscar != null && !this.nomeBuscar.isEmpty())
			setProdutosDestaque(this.produtoService.findByNome(this.nomeBuscar));
		else if (this.catId != null)
			setProdutosDestaque(this.getProdutosByCategoria(categoriaService
					.read(this.catId)));
		else if (this.gruId != null)
			setProdutosDestaque(this.getProdutosByGrupo(grupoService
					.read(this.gruId)));
		else
			setProdutosDestaque(produtoService.getListDestaque());

		// if (produtosDestaque == null) {
		// produtosDestaque = produtoService.getListDestaque();
		// }
		return produtosDestaque;
	}

	public void setProdutosDestaque(List<Produto> produtosDestaque) {
		this.produtosDestaque = produtosDestaque;
	}

	public int getNumColunas() {
		return numColunas;
	}

	public void setNumColunas(int numColunas) {
		this.numColunas = numColunas;
	}

	public String getNomeBuscar() {
		return nomeBuscar;
	}

	public void setNomeBuscar(String nomeBuscar) {
		this.nomeBuscar = nomeBuscar;
	}

	public List<Produto> getProdutosBanner() {
		if (produtosBanner == null)
			produtosBanner = this.produtoService.getListBanner();

		return produtosBanner;
	}

	public void setProdutosBanner(List<Produto> produtosBanner) {
		this.produtosBanner = produtosBanner;
	}

}
